#/usr/bin/python3
# --*-- coding:UTF8 --*--

# def fact(n):
#     if n == 1:
#         return 1
#     return n * fact(n-1)
#
# print(fact(5))

# print([ x * x for x in range(10) ])
#
# f = lambda x : x * x
# print(f(10))

# 高阶函数
# map()    : 后面序列中的每项作为一个参数作用于前面的函数

def f(x):
    return x * x

r = map(f,(1,2,3,4,5,6,7,8,9,0)) #可以是列表，元组等序列
print(list(r))


# reduce() :
# reduce把一个函数作用在一个序列[x1, x2, x3, ...]上，
# 这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算

from functools import reduce

def fn(x,y):
    return x * 10 + y

print(reduce(fn, [1,3,5,7,9]))

# filter() :
# filter()也接收一个函数和一个序列。和map()不同的是，filter()把传入的函数依次作用于每个元素，
# 然后根据返回值是True还是False决定保留还是丢弃该元素。

def is_odd(n):
    return n % 2 == 1

print(list(filter(is_odd,[1,2,4,5,6,9,10,15]))) #==>[1,5,9,15]


# sorted() :
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) )

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

#print( sorted(L, key=(L.key.lower()),reverse=True))

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))

    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >=60:
            return 'B'
        else:
            return 'C'


bman = Student('Bman',99)

print(bman.name)
print(bman.score)
bman.print_score()
print (bman.get_grade())
